SqlServer 关于 datetime 的更新引发的思考

今天在测试更新 SqlServer 表的 datetime 字段时,突然发现并没有更新成功,同时也没有报错,感觉十分诧异,因此仔细排查了一下,终于发现是和字段本身的精度有关。

现象

假设我们现在有一张 SqlServer 表 basic_info,其表结构为:

字段名 类型
name varchar
open_time datetime

现在其中有一条数据:

name open_time
Jack 2014-05-25 11:11:01.260

现在我想把这条数据的 open_time 字段修改为 2014-05-25 11:11:01.262,执行语句:

1
update basic_info set open_time = '2014-05-25 11:11:01.262' where name = 'Jack';

结果是并没有更新为我想要的值:

name open_time
Jack 2014-05-25 11:11:01.263

这个 263 是怎么出现的呢?

原因

这个问题我排查了很久,最终在关于 datetime 字段定义 的网站上,在关于字段描述的表中,有这么一行:

1
Accuracy            Rounded to increments of .000, .003, or .007 seconds

意思就是说, datetime 这个字段的 精度 ,四舍五入后会变为 .000, .003, or .007 秒。

这样的话,也就能说这个字段的时间毫秒数的个位数,只会是 0、3、7,那么也就能解释上面的现象,为什么我想更新成 2,最终变成了 3

解决方法

当你对于精度要求不高的话,比如只需要精确到秒级别,那么这个字段的使用完全是没有问题的。

但如果你一定需要精确到毫秒呢?那么可以使用 datetime2 类型,它的精度可以精确到 100 纳秒

总结

对于服务端开发人员,数据库几乎是一个无法避免的中间件,虽然我们并非专业的 DBA,但多了解一些总是好事。

有兴趣的话可以访问我的博客或者关注我的公众号、头条号,说不定会有意外的惊喜。

https://death00.github.io/

公众号:健程之道

健健 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
如果您感觉文章不错,也愿意支持一下作者的话